home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Linux LiveCD / GeeXboX 1.0 EN / geexbox-1.0-en.i386.iso / GEEXBOX / sbin / installator < prev   
Text File  |  2006-06-21  |  32KB  |  756 lines

  1. #!/bin/sh
  2.  
  3. # Detect whether partition ($1) mounted at ($2) with type ($3) is microsoft.
  4. detect_os_microsoft () {
  5.   local longname
  6.  
  7.   if [ "$3" != ntfs -a "$3" != vfat -a "$3" != msdos ]; then
  8.     return
  9.   fi
  10.  
  11.   if [ -e "$2/ntldr" -a -e "$2/NTDETECT.COM" ]; then
  12.     longname="Windows NT/2000/XP"
  13.   elif [ -e "$2/windows/win.com" ]; then
  14.     longname="Windows 95/98/Me"
  15.   elif [ -d "$2/dos" ]; then
  16.     longname="MS-DOS 5.x/6.x/Win3.1"
  17.   else
  18.     return
  19.   fi
  20.  
  21.   echo "$1:$longname:chain"
  22. }
  23.  
  24. detect_os () {
  25.   local partname partition type mpoint
  26.  
  27.   mkdir -p tmpmnt
  28.  
  29.   for partname in `sed -n "s/\ *[0-9][0-9]*\ *[0-9][0-9]*\ *[0-9][0-9][0-9]*\ \([a-z]*[0-9][0-9]*\)/\1/p" /proc/partitions`; do
  30.     partition="/dev/$partname"
  31.  
  32.     if ! grep -q "^$partition " /proc/mounts; then
  33.       if mount -o ro $partition tmpmnt >/dev/null 2>&1; then
  34.         type=$(grep "^$partition " /proc/mounts | cut -d " " -f 3)
  35.         detect_os_microsoft $partition tmpmnt $type
  36.  
  37.         umount tmpmnt >/dev/null || return
  38.       fi
  39.     else
  40.       mpoint=$(grep "^$partition " /proc/mounts | cut -d " " -f 2)
  41.       type=$(grep "^$partition " /proc/mounts | cut -d " " -f 3)
  42.  
  43.       detect_os_microsoft $partition $mpoint $type
  44.     fi
  45.   done
  46.  
  47.   rmdir tmpmnt
  48. }
  49.  
  50. # Usage: convert os_device
  51. # Convert an OS device to the corresponding GRUB drive.
  52. # This part is OS-specific.
  53. # -- taken from `grub-install`
  54. convert () {
  55.   local tmp_drive tmp_disk tmp_part
  56.  
  57.   if test ! -e "$1"; then
  58.     echo "$1: Not found or not a block device." 1>&2
  59.     exit 1
  60.   fi
  61.  
  62.   tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%'`
  63.   tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%'`
  64.  
  65.   tmp_drive=`grep -v '^#' $device_map | grep "$tmp_disk *$" \
  66.             | sed 's%.*\(([hf]d[0-9][a-g0-9,]*)\).*%\1%'`
  67.  
  68.   if [ -z "$tmp_drive" ]; then
  69.     echo "$1 does not have any corresponding BIOS drive." 1>&2
  70.     exit 1
  71.   fi
  72.  
  73.   if [ -n "$tmp_part" ]; then
  74.     # If a partition is specified, we need to translate it into the
  75.     # GRUB's syntax.
  76.     echo "$tmp_drive" | sed "s%)$%,$(($tmp_part-1)))%"
  77.   else
  78.     # If no partition is specified, just print the drive name.
  79.     echo "$tmp_drive"
  80.   fi
  81. }
  82.  
  83. # Configure network interface and parameters before installing GeeXboX to disk.
  84. setup_network () {
  85.   local title phy_type wifi_mode wep essid host_ip subnet gw_ip dns_ip smb_user smb_pwd val f
  86.  
  87.   title="$BACKTITLE : Network Configuration"
  88.   f="$1/etc/network"
  89.  
  90.   # Get type of physical interface
  91.   val=`grep PHY_TYPE $f | cut -d'"' -f2`
  92.   phy_type=`$DIALOG --no-cancel --aspect 15 --default-item $val --stdout --backtitle "$title" --title "Network Physical Interface" --menu "\nGeeXboX can only use one network physical interface at a time. If you have more than one NIC, GeeXboX will use the first one. If you have both a traditional Ethernet adapter and a Wireless card, GeeXboX will use the wireless card by default. It is recommended to keep physical interface auto-detection but you may also want to force the use of one kind of interface.\n" 0 0 0 auto "Auto detection (recommended)" ethernet "Force using Ethernet card" wifi "Force using Wireless card"` || exit 1
  93.  
  94.   # Get wireless settings only if required
  95.   if [ $phy_type = "auto" -o $phy_type = "wifi" ]; then
  96.     wifi_mode=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "Configuring WiFi Mode" --menu "\nAs you seem to be using your wireless adapter to connect this computer to your network, you will have to setup the networking mode.\n Are you connected to an access point (recommended) or directly to another computer ?\n" 0 0 0 managed "Connected to an access point (recommended)" ad-hoc "Direct Connection"` || exit 1
  97.  
  98.     val=`grep WIFI_WEP $f | cut -d'"' -f2`
  99.     wep=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "Configuring WEP key" --inputbox "\nAs you seem to be using your wireless adapter to connect this computer to your network, you may be using a WEP key. If so, please fill in the following input box with your access point WEP key or let it blank if you do not have one (open network).\n" 0 0 "$val"` || exit 1
  100.  
  101.     val=`grep WIFI_ESSID $f | cut -d'"' -f2`
  102.     essid=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "Configuring WiFi ESSID" --inputbox "\nAs you seem to be using your wireless adapter to connect this computer to your network, you probably are using an SSID. If so, please fill in the following input box with your SSID identifier or leave it blank if you do not have one (open network).\n" 0 0 "$val"` || exit 1
  103.   fi
  104.  
  105.   # get GeeXboX IP address
  106.   val=`grep HOST $f | cut -d'"' -f2`
  107.   host_ip=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "GeeXboX IP" --inputbox "\nGeeXboX needs to be allocated an IP address to be present on your network. Please fill in the following input box or leave it as it is for using DHCP autoconfiguration\n" 0 0 "$val"` || exit 1
  108.  
  109.   # do not get more settings if DHCP
  110.   if [ ! -z $host_ip ]; then
  111.     val=`grep SUBNET $f | cut -d'"' -f2`
  112.     subnet=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "GeeXboX Subnet" --inputbox "\nYou may want to connect GeeXboX to the Internet. Please fill in the following input box with your network Subnet mask or leave it blank if you do not want to set a subnet mask for this computer.\n" 0 0 "$val"` || exit 1
  113.  
  114.     val=`grep GATEWAY $f | cut -d'"' -f2`
  115.     gw_ip=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "GeeXboX GateWay" --inputbox "\nYou may want to connect GeeXboX to the Internet. Please fill in the following input box with your gateway IP address or leave it blank if you do not want to set a gateway for this computer.\n" 0 0 "$val"` || exit 1
  116.  
  117.     val=`grep DNS_SERVER $f | cut -d'"' -f2`
  118.     dns_ip=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "GeeXboX DNS Server" --inputbox "\nYou may want to connect GeeXboX to the Internet. Please fill in the following input box with your DNS Server IP address used for name resolving or leave it blank if you do not want to resolve names with this computer.\n" 0 0 "$val"` || exit 1
  119.   fi
  120.  
  121.   # get samba user name
  122.   val=`grep SMB_USER $f | cut -d'"' -f2`
  123.   smb_user=`$DIALOG --no-cancel --stdout --backtitle "$title" --title "Set Samba User name" --inputbox "\nWhen accessing to remote Samba shares, you may need to be authenticated. Most of Microsoft Windows computers let you anonymously access to remote shares using the guest account (SHARE). Please fill in the following input box with your user name for accesing to remote Samba shares or leave it blank if you do not have one.\n" 0 0 "$val"` || exit 1
  124.  
  125.   # get samba password
  126.   val=`grep SMB_PWD $f | cut -d'"' -f2`
  127.   smb_pwd=`$DIALOG --no-cancel --stdout --backtitle "$title" --title "Set Samba Password" --inputbox "\nIf user needs to be authenticated through a password, please fill in the following input box with it or leave it blank if you do not have one.\n" 0 0 "$val"` || exit 1
  128.  
  129.   sed -i "s%^PHY_TYPE=\".*\"\(.*\)%PHY_TYPE=\"$phy_type\"\1%" $f
  130.   sed -i "s%^WIFI_MODE=\".*\"\(.*\)%WIFI_MODE=\"$wifi_mode\"\1%" $f
  131.   sed -i "s%^WIFI_WEP=\".*\"\(.*\)%WIFI_WEP=\"$wep\"\1%" $f
  132.   sed -i "s%^WIFI_ESSID=\".*\"\(.*\)%WIFI_ESSID=\"$essid\"\1%" $f
  133.   sed -i "s%^HOST=.*%HOST=\"$host_ip\"%" $f
  134.   sed -i "s%^SUBNET=.*%SUBNET=\"$subnet\"%" $f
  135.   sed -i "s%^GATEWAY=.*%GATEWAY=\"$gw_ip\"%" $f
  136.   sed -i "s%^DNS_SERVER=.*%DNS_SERVER=\"$dns_ip\"%" $f
  137.   sed -i "s%^SMB_USER=.*%SMB_USER=\"$smb_user\"%" $f
  138.   sed -i "s%^SMB_PWD=.*%SMB_PWD=\"$smb_pwd\"%" $f
  139. }
  140.  
  141. # Configure TV card and scan for channels.
  142. setup_tvscan () {
  143.   MPTVSCAN=/usr/bin/mptvscan
  144.   title="$BACKTITLE : Analog TV Channels Scanner"
  145.  
  146.   for i in `$MPTVSCAN -i`; do
  147.     INPUTS="$INPUTS $i ''"
  148.   done
  149.  
  150.   for i in `$MPTVSCAN -s`; do
  151.     NORMS="$NORMS $i ''"
  152.   done
  153.  
  154.   for i in `$MPTVSCAN -c`; do
  155.     CHANLISTS="$CHANLISTS $i ''"
  156.   done
  157.  
  158.   while [ -z "$DONE" ]; do
  159.     INPUT=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "TV Input Selection" --menu "\nBelow is the list of your TV card's available inputs. Please select the one you want to use for channels scan (should be Television)." 0 0 0 $INPUTS`
  160.  
  161.     NORM=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "TV Norm Selection" --menu "\nBelow is the list of your TV card's supported video standards. Please select the one you want to use, according to your localization." 0 0 0 $NORMS`
  162.  
  163.     CHANLIST=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "TV Chanlist Selection" --menu "\nBelow is the list of pre-configured chanlists for scan. Select the one corresponding to your location." 0 0 0 $CHANLISTS`
  164.  
  165.     $MPTVSCAN -a "-i$INPUT" "-s$NORM" "-c$CHANLIST" -p 2>/tmp/chans | $DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "Scanning Channels" --gauge "\nGeeXboX is currently scanning your channels. This operation may take a while. Please wait while processing ..." 0 0
  166.  
  167.     CHANNELS=`sed -e 's/CHAN=//g' -e 's/:/ - /g' -e 's/\"//g' -e 's/$/\\\\n/g' /tmp/chans`
  168.     $DIALOG --aspect 12 --stdout --yes-label "Accept" --no-label "Retry" --backtitle "$title" --title "Scan Done ..." --yesno "\nCongratulations, the TV channels scan is done. The following channels has been discoverd (if no channel has been found, you can then try again with new card/tuner/norm/chanlist settings).\n\n$CHANNELS" 0 0 && DONE=true
  169.   done
  170.  
  171.   if [ -s /tmp/chans ]; then
  172.     cat /tmp/chans >> $1/etc/tvcard
  173.   fi
  174.   rm -f /tmp/chans
  175.  
  176.   sed -i "s/^TVIN_STANDARD=.*/TVIN_STANDARD=$NORM/" $1/etc/tvcard
  177.   sed -i "s/^CHANLIST=.*/CHANLIST=$CHANLIST/" $1/etc/tvcard
  178. }
  179.  
  180. # Configure DVB card and scan for channels.
  181. setup_dvbscan () {
  182.   DVB_LIST=/usr/share/dvb
  183.   DVB_FILE=/usr/share/dvb.tar.lzma
  184.  
  185.   DVBSCAN=/usr/bin/dvbscan
  186.   SCAN_ARGS="-x 0" # Scan FreeToAir channels only
  187.  
  188.   TITLE="$BACKTITLE : Digital TV Channels Scanner"
  189.   CHANNELS_CONF="$1/etc/mplayer/channels.conf"
  190.  
  191.   if [ -f $DVB_FILE -a ! -d $DVB_LIST ]; then
  192.     tar xaf $DVB_FILE -C /usr/share
  193.   fi
  194.  
  195.   DVB_TYPE=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$TITLE" --title "DVB Card Type Selection" --menu "\nBelow is the list of available DVB card types. Please select the one you want to use for channels scan." 0 0 0 dvb-s "DVB Sattelite" dvb-t "DVB Terrestrial" dvb-c "DVB Cable" atsc "ATSC (US)"`
  196.  
  197.   # DVB Terrestrial cards
  198.   if [ $DVB_TYPE = "dvb-t" ]; then
  199.     for i in `ls $DVB_LIST/$DVB_TYPE`; do
  200.       COUNTRIES="$COUNTRIES $i ''"
  201.     done
  202.  
  203.     COUNTRY=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$TITLE" --title "Country Selection" --menu "\nBelow is the list of countries with known DVB-T transponders frequencies. Please select the one where you live." 0 0 0 $COUNTRIES`
  204.  
  205.     for i in `ls $DVB_LIST/$DVB_TYPE/$COUNTRY`; do
  206.       CITIES="$CITIES $i ''"
  207.     done
  208.  
  209.     CITY=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$TITLE" --title "City Selection" --menu "\nBelow is the list of locations from your country with known DVB-T transponders frequencies. If you live in place not present in this list, please contact your DVB provider, asking for your local transponders frequencies and send this information to the LinuxTV (http://www.linuxtv.org/) team. Otherwise, simply choose the town nearest to where you live." 0 0 0 $CITIES`
  210.  
  211.     $DVBSCAN $SCAN_ARGS $DVB_LIST/$DVB_TYPE/$COUNTRY/$CITY > $CHANNELS_CONF
  212.   elif [ $DVB_TYPE = "dvb-s" ]; then
  213.     for i in `ls $DVB_LIST/$DVB_TYPE`; do
  214.       SATS="$SATS $i ''"
  215.     done
  216.  
  217.     SAT=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$TITLE" --title "Satellite Selection" --menu "\nBelow is the list of known DVB-S satellite transponders you may be able to be connected to. If you are using another transponder which is not present in this list, please contact your DVB provider, asking for your transponder frequencies and send this information to the LinuxTV (http://www.linuxtv.org/) team. Otherwise, simply choose the one that fits your needs." 0 0 0 $SATS`
  218.  
  219.     $DVBSCAN $SCAN_ARGS $DVB_LIST/$DVB_TYPE/$SAT > $CHANNELS_CONF
  220.   elif [ $DVB_TYPE = "dvb-c" ]; then
  221.     for i in `ls $DVB_LIST/$DVB_TYPE`; do
  222.       COUNTRIES="$COUNTRIES $i ''"
  223.     done
  224.  
  225.     COUNTRY=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$TITLE" --title "Country Selection" --menu "\nBelow is the list of countries with known DVB-C transponders frequencies. Please select the one where you live." 0 0 0 $COUNTRIES`
  226.  
  227.     for i in `ls $DVB_LIST/$DVB_TYPE/$COUNTRY`; do
  228.       CITIES="$CITIES $i ''"
  229.     done
  230.  
  231.     CITY=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$TITLE" --title "City Selection" --menu "\nBelow is the list of locations from your country with known DVB-C transponders frequencies. If you live in place not present in this list, please contact your DVB provider, asking for your local transponders frequencies and send this information to the LinuxTV (http://www.linuxtv.org/) team. Otherwise, simply choose the town nearest to the place you live." 0 0 0 $CITIES`
  232.  
  233.     $DVBSCAN $SCAN_ARGS $DVB_LIST/$DVB_TYPE/$COUNTRY/$CITY > $CHANNELS_CONF
  234.   elif [ $DVB_TYPE = "atsc" ]; then
  235.     for i in `ls $DVB_LIST/$DVB_TYPE`; do
  236.       ATSC="$ATSC $i ''"
  237.     done
  238.  
  239.     FREQ=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$TITLE" --title "ATSC Transponder Selection" --menu "\nBelow is the list of known ATSC transponders you may be able to be connected to. If you are using another transponder which is not present in this list, please contact your ATSC provider, asking for your transponder frequencies and send this information to the LinuxTV (http://www.linuxtv.org/) team. Otherwise, simply choose the one that fits your needs." 0 0 0 $ATSC`
  240.  
  241.     $DVBSCAN $SCAN_ARGS $DVB_LIST/$DVB_TYPE/$FREQ > $CHANNELS_CONF
  242.   fi
  243.  
  244.   if [ -s $CHANNELS_CONF ]; then
  245.     # remove non-coherent detected channels
  246.     grep -v "^\[.*\]:" $CHANNELS_CONF > /tmp/channels.conf
  247.     mv /tmp/channels.conf $CHANNELS_CONF
  248.   fi
  249. }
  250.  
  251. # Configure recorder settings (recording path and encoding profile)
  252. setup_recorder () {
  253.   title="$BACKTITLE : Recorder Configuration"
  254.  
  255.   f="$1/etc/recorder"
  256.   mencoder_cfg="$1/etc/mplayer/mencoder.conf"
  257.  
  258.   . $f
  259.  
  260.   $DIALOG --aspect 12 --stdout --backtitle "$title" --title "Recording Capabilities (EXPERIMENTAL) ..." --yesno "\nGeeXboX allows you to record different kinds of media (TV, DVB, NetStreams ...) to disk, according to various encoding profiles (MPEG 1/2, DVD ...). You may want to use this feature and thus, need to specify an HDD location where to save the records.\n\nWARNING: This is an _EXPERIMENTAL_ feature. Be aware that your HDD will be mounted R/W while recording streams to it, leading to a potential risk of disk data corruption.\n\nWould you still configure GeeXboX recording capabilities ?\n" 0 0 || return
  261.  
  262.   # get list of encoding profiles
  263.   for profile in `grep "^\[" $mencoder_cfg | grep -v common | grep -v dump | sed -e 's/\[//' -e 's/\]//'`; do
  264.     profiles="$profiles $profile ''"
  265.   done
  266.  
  267.   while [ -z "$DONE" ]; do
  268.     # choose the encoding profile
  269.     p=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "Recorder default encoding profile" --menu "\nGeeXboX lets you record video streams through various encoding profiles. They may vary in terms of encoding speed and quality. It is possible to choose one over an other at runtime through the GeeXboX recorder menu. Please choose the encoding profile you want to use as a default.\n" 0 0 0 $profiles` || exit 1
  270.  
  271.     record_path=`$DIALOG --no-cancel --aspect 15 --stdout --backtitle "$title" --title "Recordings location" --inputbox "\nPlease type in the location where you want recordings to be saved to. Please note that the corresponding device (HDD) will be remounted R/W in order to attempt saving data to it.\n" 0 0 "$SAVE_PATH"` || exit 1
  272.  
  273.     $DIALOG --aspect 12 --stdout --yes-label "Accept" --no-label "Retry" --backtitle "$title" --title "Configuration Done ..." --yesno "\nCongratulations, recording settings have been fully configured. Are you satisfied with the following settings:\n\nEncoding Profile: $p\nRecording Path: $record_path" 0 0 && DONE=true
  274.   done
  275.  
  276.   sed -i "s%^RECORD_PROFILE.*%RECORD_PROFILE=$p%" $f
  277.   sed -i "s%^SAVE_PATH.*%SAVE_PATH=\"$record_path\"%" $f
  278. }
  279.  
  280. /bin/busybox mount -t proc none /proc
  281. /bin/busybox mount -t sysfs none /sys
  282. /bin/busybox --install -s
  283.  
  284. if [ "$1" = geexbox ]; then
  285.   DIALOG=/usr/bin/dialog
  286.   CFDISK=/usr/bin/cfdisk
  287.   SFDISK=/usr/bin/sfdisk
  288.   MKDOSFS=/usr/bin/mkdosfs
  289.   MKE2FS=/sbin/mke2fs
  290.   GRUB=/usr/bin/grub
  291.   SYSLINUX=/usr/bin/syslinux
  292. else
  293.   DIALOG=`which dialog`
  294.   CFDISK=`which cfdisk`
  295.   SFDISK=`which sfdisk`
  296.   MKDOSFS=`which mkdosfs`
  297.   MKE2FS=`which mke2fs`
  298.   GRUB=`which grub`
  299.   SYSLINUX=`which syslinux`
  300. fi
  301. VERSION=1.0
  302. BACKTITLE="GeeXboX $VERSION installator"
  303.  
  304. if [ "$UID" != "0" ]; then
  305.   echo ""
  306.   echo "**** You need to be root to install GeeXboX ****"
  307.   echo ""
  308.   exit 1
  309. fi
  310.  
  311. if [ -z "$SFDISK" -o -z "$GRUB" -o -z "$DIALOG" ]; then
  312.   echo ""
  313.   echo "**** You need to have sfdisk, grub and dialog installed to install GeeXboX ****"
  314.   echo ""
  315.   exit 1
  316. fi
  317.  
  318. if [ ! -d "/sys/block" ]; then
  319.   echo ""
  320.   echo "**** You need to have a mounted sysfs at /sys. try executing: mount -t sysfs none /sys ****"
  321.   echo ""
  322.   exit 1
  323. fi
  324.  
  325. # disable kernel messages to avoid screen corruption
  326. echo 0 > /proc/sys/kernel/printk
  327.  
  328. while true; do
  329.   if [ -e /dev/.devfsd ]; then
  330.     DISKS=`cat /proc/partitions | sed -n "s/\ *[0-9][0-9]*\ *[0-9][0-9]*\ *\([0-9][0-9]*\)\ \([a-z0-9/]*disc\).*$/\2 (\1_blocks)/p"`
  331.   else
  332.     DISKS=`cat /proc/partitions | sed -n "s/\ *[0-9][0-9]*\ *[0-9][0-9]*\ *\([0-9][0-9]*\)\ \([a-z]*\)$/\2 (\1_blocks)/p"`
  333.   fi
  334.   if [ -z "$DISKS" ]; then
  335.     $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "ERROR" --yesno "\nNo disks found on this system.\nCheck again ?" 0 0 || exit 1
  336.   else
  337.     DISKS="$DISKS refresh list"
  338.     DISK=`$DIALOG --stdout --backtitle "$BACKTITLE" --title "Installation device" --menu "\nYou are going to install GeeXboX. For this you will need an empty partition with about 8 MB of free space.\nBe careful to choose the right disk! We won't take responsibility for any data loss." 0 0 0 $DISKS` || exit 1
  339.     [ $DISK != refresh ] && break
  340.   fi
  341. done
  342.  
  343. if [ "`cat /sys/block/$DISK/removable`" = 1 ]; then
  344.   BOOTLOADER=`$DIALOG --stdout --aspect 15 --backtitle "$BACKTITLE" --title "Linux partition type" --menu "Which type of boot loader you want ? " 0 0 0 grub "GNU GRUB - Doesn't work with oldest BIOS" syslinux "Syslinux - For oldest BIOS compatbility"` || exit 1
  345.   TYPE=REMOVABLE
  346. else
  347.   BOOTLOADER=grub
  348.   TYPE=HDD
  349. fi
  350.  
  351. if [ $BOOTLOADER = syslinux ]; then
  352.   PART_MSG="FAT partition (type=06)"
  353. elif [ $BOOTLOADER = grub ]; then
  354.   PART_MSG="FAT partition (type=0B) or Linux ext2/3 partition (type=83)"
  355. fi
  356.  
  357. if [ -z "$CFDISK" ]; then
  358.   CFDISK_MSG="As you don't have cfdisk installed, the installator won't be able to create the partition for you. You'll have to create it yourself before installing."
  359. else
  360.   CFDISK_MSG="Please edit your partition table to create a $PART_MSG with about 8 MB of free space.\nRemember to write the changes when done. We won't take responsibility for any data loss."
  361. fi
  362. $DIALOG --stdout --backtitle "$BACKTITLE" --title "Installation device" --msgbox "$CFDISK_MSG" 0 0 || exit 1
  363.  
  364. if [ -n "$CFDISK" ]; then
  365.   $CFDISK /dev/$DISK || exit 1
  366. fi
  367.  
  368. while [ ! -b "$DEV" ]; do
  369.   DISKS=""
  370.   for i in `$SFDISK -l /dev/$DISK | grep ${DISK%disc} | cut -f1 -d' '`; do
  371.     case `$SFDISK --print-id ${i%%[0-9]*} ${i#${i%%[0-9]*}}` in
  372.       1|11|6|e|16|1e|b|c|1b|1c) #FAT12/16/32 are supported both in syslinux and grub.
  373.         S=`$SFDISK -s "$i" | sed 's/\([0-9]*\)[0-9]\{3\}/\1/'`
  374.         DISKS="$DISKS $i ${S}MB"
  375.         ;;
  376.       83) #Linux is supported only in grub.
  377.         if [ $BOOTLOADER = grub ]; then
  378.           S=`$SFDISK -s "$i" | sed 's/\([0-9]*\)[0-9]\{3\}/\1/'`
  379.           DISKS="$DISKS $i ${S}MB"
  380.         fi
  381.         ;;
  382.     esac
  383.   done
  384.   if [ -z "$DISKS" ]; then
  385.     $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "ERROR" --msgbox "\nYou don't have any $PART_MSG partition on your system. Please create a partition first using for example cfdisk.\n" 0 0
  386.     exit 1
  387.   else
  388.     DEV=`$DIALOG --stdout --aspect 15 --backtitle "$BACKTITLE" --title "Installation device" --menu "Where do you want to install GeeXboX ?" 0 0 0 $DISKS` || exit 1
  389.   fi
  390.   if [ ! -b "$DEV" ]; then
  391.     $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "ERROR" --msgbox "\n'$DEV' is not a valid block device.\n" 0 0
  392.   fi
  393. done
  394.  
  395. DEVNAME="${DEV#/dev/}"
  396.  
  397. case `$SFDISK --print-id ${DEV%%[0-9]*} ${DEV#${DEV%%[0-9]*}}` in
  398.   1|11|6|e|16|1e|14|b|c|1b|1c)
  399.     SUPPORTED_TYPES="vfat"
  400.     PART_TYPE="FAT"
  401.     ;;
  402.   83) # Linux
  403.     SUPPORTED_TYPES="ext3 ext2"
  404.     PART_TYPE="Linux"
  405.     ;;
  406. esac
  407.  
  408. mkdir di
  409.  
  410. # Try to guess current partition type.
  411. MKFS_TYPE=
  412. for type in vfat ext3 ext2 auto; do
  413.   if mount -o ro -t $type "$DEV" di; then
  414.     MKFS_TYPE=`grep "^$DEV " /proc/mounts | cut -d " " -f 3`
  415.     umount di
  416.     break
  417.   fi
  418. done
  419.  
  420. NEED_FORMAT=yes
  421. if [ -z "$MKFS_TYPE" ]; then
  422.   FORMAT_MSG="Partition is not formated. "
  423. else
  424.   for type in $SUPPORTED_TYPES; do
  425.     [ $type = $MKFS_TYPE ] && NEED_FORMAT=no
  426.   done
  427.  
  428.   if [ "$NEED_FORMAT" = yes ]; then
  429.     FORMAT_MSG="Partition format type ($MKFS_TYPE) is not supported in your partition type ($PART_TYPE). "
  430.   else
  431.     FORMAT_MSG="Partition is already formated. "
  432.   fi
  433. fi
  434.  
  435. $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Formatting" --defaultno --yesno "$FORMAT_MSG\nDo you want to format '$DEV' ?\n" 0 0 && FORMAT=yes
  436.  
  437. if [ "$FORMAT" = yes ]; then
  438.   case `$SFDISK --print-id ${DEV%%[0-9]*} ${DEV#${DEV%%[0-9]*}}` in
  439.     1|11|6|e|16|1e|14) # FAT12 and FAT16
  440.       MKFS=$MKDOSFS
  441.       MKFS_OPT="-n GEEXBOX"
  442.       MKFS_TYPE=vfat
  443.       MKFS_TYPENAME="FAT"
  444.       ;;
  445.     b|c|1b|1c) # FAT32
  446.       MKFS=$MKDOSFS
  447.       MKFS_OPT="-n GEEXBOX -F 32"
  448.       MKFS_TYPE=vfat
  449.       MKFS_TYPENAME="FAT"
  450.       ;;
  451.     83) # Linux
  452.       MKFS_TYPE=`$DIALOG --stdout --aspect 15 --backtitle "$BACKTITLE" --title "Linux partition type" --menu "Which type of Linux partition you want ?" 0 0 0 ext2 "Linux ext2" ext3 "Linux ext3"` || exit 1
  453.  
  454.       case $MKFS_TYPE in
  455.         ext2)
  456.           MKFS=$MKE2FS
  457.           MKFS_OPT="-L GEEXBOX"
  458.           MKFS_TYPENAME="Linux ext2"
  459.           ;;
  460.         ext3)
  461.           MKFS=$MKE2FS
  462.           MKFS_OPT="-L GEEXBOX -j"
  463.           MKFS_TYPENAME="Linux ext3"
  464.           ;;
  465.       esac
  466.       ;;
  467.   esac
  468.  
  469.   if [ -z "$MKFS" -o ! -x $MKFS ]; then
  470.     if [ "$NEED_FORMAT" = yes ]; then
  471.       $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "ERROR" --msgbox "\n'$DEV' must be formated. As you don't have formatting tool installed, I won't be able to format the partition.\n" 0 0
  472.       rmdir di
  473.       exit 1
  474.     else
  475.       $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Warning" --msgbox "\n'$DEV' needs to be a $MKFS_TYPENAME partition. As you don't have formatting tool installed, I won't be able to format the partition. Hopefully it is already formatted.\n" 0 0
  476.     fi
  477.   else
  478.     $MKFS $MKFS_OPT "$DEV"
  479.   fi
  480. elif [ "$NEED_FORMAT" = yes ]; then
  481.   $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "ERROR" --msgbox "\n'$DEV' needs to be a formatted.\n" 0 0
  482.   rmdir di
  483.   exit 1
  484. fi
  485.  
  486. mount -t $MKFS_TYPE "$DEV" di
  487. if [ $? -ne 0 ]; then
  488.   $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "ERROR" --msgbox "\nFailed to mount '$DEV' as $MKFS_TYPENAME partition.\n" 0 0
  489.   rmdir di
  490.   exit 1
  491. fi
  492.  
  493. if [ -d disk ]; then
  494.   cp -a disk/* di 2>/dev/null
  495. else
  496.   if [ -n "$NFS" ]; then
  497.     GEEXBOX="$NFS"
  498.   else
  499.     GEEXBOX="$CDROM/GEEXBOX"
  500.   fi
  501.   cp -a "$GEEXBOX" di/GEEXBOX 2>/dev/null
  502.   cd di/GEEXBOX/boot
  503.   mv vmlinuz initrd.gz isolinux.cfg boot.msg help.msg splash.rle ../../
  504.   cd ../../../
  505.   rm -rf di/GEEXBOX/boot
  506. fi
  507.  
  508. # Setup network is only available when booting from GeeXboX.
  509. if [ "$1" = geexbox ]; then
  510.   $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Configure Network ?" --yesno "\nDo you want to configure your network parameters before installing GeeXboX to disk ?\n" 0 0 && setup_network "di/GEEXBOX"
  511. fi
  512.  
  513. # Configure TV card and scan for channels.
  514. # (only available when booting from GeeXboX).
  515. if [ "$1" = geexbox ]; then
  516.   if grep -q 'Class 0400:.*109e:' /proc/pci ||
  517.      grep -q 'Class 0480:.*1131:' /proc/pci ||
  518.      grep -q 'Class 0480:.*14f1:88' /proc/pci; then
  519.  
  520.     # Only scan if a TV card is detected
  521.     /usr/bin/mptvscan -i >/dev/null 2>&1
  522.     if [ `echo $?` = 0 ]; then
  523.       $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Scan for Analog TV Channels ?" --yesno "\nDo you want to configure your analog tv card and scan for channels before installing GeeXboX to disk ?\n" 0 0 && setup_tvscan "di/GEEXBOX"
  524.     fi
  525.   fi
  526. fi
  527.  
  528. # Configure DVB card and scan for channels.
  529. # (only available when booting from GeeXboX).
  530. if [ "$1" = geexbox ]; then
  531.   # Only scan if a DVB card is detected
  532.   if [ -f /var/dvbcard ]; then
  533.     $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Scan for Digital (DVB) TV Channels ?" --yesno "\nDo you want to configure your digital (DVB) tv card and scan for channels before installing GeeXboX to disk ?\n" 0 0 && setup_dvbscan "di/GEEXBOX"
  534.   fi
  535. fi
  536.  
  537. # Configure Recorder settings
  538. # (only available when booting from GeeXboX).
  539. if [ "$1" = geexbox ]; then
  540.   # Only if MEncoder binary exists
  541.   if [ -f /usr/bin/mencoder ]; then
  542.     setup_recorder "di/GEEXBOX"
  543.   fi
  544. fi
  545.  
  546. VESA_MODE_OLD=`grep vga= di/isolinux.cfg | head -1 | sed "s%.*vga=\([^ ]*\).*%\1%"`
  547.  
  548. VESA_RES=$((($VESA_MODE_OLD - 784) / 3))
  549. VESA_DEPTH=$((($VESA_MODE_OLD - 784) % 3))
  550.  
  551. if [ $VESA_DEPTH != 0 -a $VESA_DEPTH != 1 -a $VESA_DEPTH != 2 ] ||
  552.    [ $VESA_RES != 0 -a $VESA_RES != 1 -a $VESA_RES != 2 -a $VESA_RES != 3 ]; then
  553.   VESA_RES=1
  554.   VESA_DEPTH=2
  555. fi
  556.  
  557. VESA_RES=`$DIALOG --stdout --aspect 15 --backtitle "$BACKTITLE" --title "Screen Resolution" --default-item $VESA_RES --menu "Select from options below" 000 0 0 0 "640x480" 1 "800x600" 2 "1024x768" 3 "1280x1024" 4 "1600x1200"`
  558.  
  559. VESA_DEPTH=`$DIALOG --stdout --aspect 15 --backtitle "$BACKTITLE" --title "Screen Color Depth" --default-item $VESA_DEPTH --menu "Select from options below" 000 0 0 0 "15 bit" 1 "16 bit" 2 "24 bit"`
  560.  
  561. VESA_MODE=$((784 + VESA_RES*3 + VESA_DEPTH))
  562. [ $VESA_MODE -ge 796 ] && VESA_MODE=$((VESA_MODE + 1))
  563.  
  564. if grep -q "splash=silent" di/isolinux.cfg; then
  565.   SPLASH_ARGUMENT=""
  566.   SPLASH_OLD="silent"
  567. else
  568.   SPLASH_ARGUMENT="--defaultno"
  569.   SPLASH_OLD="0"
  570. fi
  571.  
  572. $DIALOG --aspect 15 --backtitle "$BACKTITLE" --defaultno --title "Bootsplash" $SPLASH_ARGUMENT --yesno "\nDo you want to disable bootsplash ?\n" 0 0 && SPLASH="0" || SPLASH="silent"
  573.  
  574. grubprefix=/boot/grub
  575. grubdir=di$grubprefix
  576. device_map=$grubdir/device.map
  577.  
  578. rm -rf $grubdir
  579. mkdir -p $grubdir
  580. tar xaf "di/GEEXBOX/usr/share/grub-i386-pc.tar.lzma" -C $grubdir
  581.  
  582. if [ -f "di/GEEXBOX/usr/share/grub-splash.xpm.gz" ]; then
  583.   cp -f "di/GEEXBOX/usr/share/grub-splash.xpm.gz" $grubdir || exit 1
  584.   disable_splashimage=
  585. else
  586.   disable_splashimage="#"
  587. fi
  588. splashimage="$grubprefix/grub-splash.xpm.gz"
  589.  
  590. if [ $BOOTLOADER = syslinux ]; then
  591.   cp "di/GEEXBOX/usr/share/ldlinux.sys" di
  592.   sed -e "s/boot=cdrom/boot=${DEV#/dev/}/" -e "s/vga=$VESA_MODE_OLD/vga=$VESA_MODE/" -e "s/splash=$SPLASH_OLD/splash=$SPLASH/" di/isolinux.cfg > di/syslinux.cfg
  593.   rm di/isolinux.cfg
  594. elif [ $BOOTLOADER = grub ]; then
  595.   cp $grubdir/stage2 $grubdir/stage2_single
  596.   rm di/isolinux.cfg di/boot.msg di/help.msg di/splash.rle
  597. fi
  598.  
  599. if [ $TYPE = HDD ]; then
  600.   echo "quit" | $GRUB --batch --no-floppy --device-map=$device_map
  601. elif [ $TYPE = REMOVABLE ]; then
  602.   echo "(hd0) ${DEV%%[0-9]*}" > $device_map
  603. fi
  604.  
  605. rootdev=$(convert $DEV)
  606.  
  607. if [ -z "$rootdev" ]; then
  608.   $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "ERROR" --msgbox "\nCouldn't find my GRUB partition representation\n" 0 0
  609.   umount di
  610.   rmdir di
  611.   exit 1
  612. fi
  613.  
  614. if [ $BOOTLOADER = syslinux ]; then
  615.   umount di
  616.   $SYSLINUX "$DEV"
  617.   mount -t $MKFS_TYPE "$DEV" di
  618. elif [ $BOOTLOADER = grub ]; then
  619.   if [ $TYPE = HDD ]; then
  620.     rootdev_single=$rootdev
  621.     fake_device=
  622.   elif [ $TYPE = REMOVABLE ]; then
  623.     rootdev_single="(fd0)"
  624.     fake_device="device $rootdev_single $DEV"
  625.   fi
  626.  
  627.   $GRUB --batch --no-floppy --device-map=$device_map <<EOF
  628. $fake_device
  629. root $rootdev_single
  630. install --stage2=$grubdir/stage2_single $grubprefix/stage1 $rootdev_single $grubprefix/stage2_single p $grubprefix/single.lst
  631. EOF
  632.  
  633.   cat > $grubdir/single.lst <<EOF
  634. default  0
  635. timeout  2
  636. color cyan/blue white/blue
  637. ${disable_splashimage}splashimage=$rootdev_single$splashimage
  638.  
  639. title    GeeXboX
  640. root    $rootdev_single
  641. kernel    /vmlinuz root=/dev/ram0 rw init=linuxrc boot=$DEVNAME splash=$SPLASH vga=$VESA_MODE video=vesafb:ywrap,mtrr
  642. initrd  /initrd.gz
  643. boot
  644.  
  645. title    GeeXboX (debug)
  646. root    $rootdev_single
  647. kernel    /vmlinuz root=/dev/ram0 rw init=linuxrc boot=$DEVNAME splash=0 vga=$VESA_MODE video=vesafb:ywrap,mtrr debugging
  648. initrd  /initrd.gz
  649. boot
  650. EOF
  651. fi
  652.  
  653. if [ $TYPE = HDD ]; then
  654.   oslist=$(detect_os)
  655.  
  656.   supported_os_list=""
  657.   saveifs=$IFS
  658.   IFS='
  659. '
  660.   for os in $oslist; do
  661.       title=$(echo "$os" | cut -d: -f2)
  662.       if [ -n "$supported_os_list" ]; then
  663.       supported_os_list="$supported_os_list, $title"
  664.       else
  665.       supported_os_list="$title"
  666.       fi
  667.   done
  668.   IFS=$saveifs
  669.  
  670.   if [ -n "$supported_os_list" ]; then
  671.     $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Bootloader" --defaultno --yesno "\n'$DEV' is now a GeeXboX partition. To boot from it, you will need to install a bootloader. I can install one for you. If you have any other operating system on your computer, I will also install a multiboot for you. If you do not want me to install a new bootloader, you will need to configure yours alone.\nI have found: $supported_os_list\nDo you want to install me to install the boot loader (GRUB) for you ?\n" 0 0 && MBR=yes
  672.   else
  673.     $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Bootloader" --defaultno --yesno "\n'$DEV' is now a GeeXboX partition. I didn't recognize any other OS on your system, want me to install boot loader on your MBR ?\n" 0 0 && MBR=yes
  674.   fi
  675. elif [ $TYPE = REMOVABLE ]; then
  676.   oslist=
  677.   MBR=yes
  678. fi
  679.  
  680. if [ "$MBR" = "yes" ]; then
  681.   $GRUB --batch --no-floppy --device-map=$device_map <<EOF
  682. root $rootdev
  683. setup --stage2=$grubdir/stage2 --prefix=$grubprefix (hd0)
  684. EOF
  685.  
  686.   cat > $grubdir/menu.lst <<EOF
  687. default  0
  688. timeout  5
  689. color cyan/blue white/blue
  690. ${disable_splashimage}splashimage=$rootdev$splashimage
  691.  
  692. EOF
  693.  
  694.   saveifs=$IFS
  695.   IFS='
  696. '
  697.   for os in $oslist; do
  698.     partition=$(echo "$os" | cut -d: -f1)
  699.     grubpartition=$(convert $partition)
  700.  
  701.     if [ -z "$grubpartition" ]; then
  702.     continue
  703.     fi
  704.  
  705.     grubdisk=${grubpartition%,*}
  706.     grubdisk="(${grubdisk#(})"
  707.     title=$(echo "$os" | cut -d: -f2)
  708.     type=$(echo "$os" | cut -d: -f3)
  709.  
  710.     if [ "$type" = chain ]; then
  711.       cat >> $grubdir/menu.lst <<EOF
  712. title    $title
  713. EOF
  714.       if [ $grubdisk != "(hd0)" ]; then
  715.         cat >> $grubdir/menu.lst <<EOF
  716. map (hd0) $grubdisk
  717. map $grubdisk (hd0)
  718. EOF
  719.       fi
  720.  
  721.       cat >> $grubdir/menu.lst <<EOF
  722. rootnoverify $grubpartition
  723. makeactive
  724. chainloader +1
  725. boot
  726.  
  727. EOF
  728.     fi
  729.   done
  730.   IFS=$saveifs
  731.  
  732.   cat >> $grubdir/menu.lst <<EOF
  733. title    GeeXboX
  734. root    $rootdev
  735. kernel    /vmlinuz root=/dev/ram0 rw init=linuxrc boot=$DEVNAME splash=$SPLASH vga=$VESA_MODE video=vesafb:ywrap,mtrr
  736. initrd  /initrd.gz
  737. boot
  738.  
  739. title    GeeXboX (debug)
  740. root    $rootdev
  741. kernel    /vmlinuz root=/dev/ram0 rw init=linuxrc boot=$DEVNAME splash=0 vga=$VESA_MODE video=vesafb:ywrap,mtrr debugging
  742. initrd  /initrd.gz
  743. boot
  744. EOF
  745.  
  746. else
  747.   $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Bootloader" --msgbox "\nYou must install a boot loader to boot GeeXboX\n" 0 0
  748. fi
  749.  
  750. umount di
  751. rmdir di
  752.  
  753. [ -n "$CDROM" ] && eject &
  754.  
  755. $DIALOG --aspect 15 --backtitle "$BACKTITLE" --title "Have Fun!" --msgbox "\nGeeXboX is now installed on '$DEV'\n" 0 0
  756.